package com.xinke.module.system.service.oauth2;

import javax.validation.*;

import com.xinke.module.system.model.entity.oauth2.OAuth2ClientDO;
import com.xinke.module.system.model.entity.oauth2.OAuth2RefreshTokenDO;
import com.xinke.module.system.model.vo.oauth2.*;
import com.xinke.module.system.model.entity.oauth2.OAuth2AccessTokenDO;
import com.xinke.component.common.pojo.PageResult;

/**
 * OAuth2 访问令牌 Service 接口
 *
 * @author yzx
 */
public interface OAuth2AccessTokenService {

    /**
     * 创建OAuth2 访问令牌
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createOAuth2AccessToken(@Valid OAuth2AccessTokenSaveReqVO createReqVO);

    /**
     * 创建OAuth2 访问令牌
     * @param refreshTokenDO
     * @param clientDO
     * @return
     */
    OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2RefreshTokenDO refreshTokenDO, OAuth2ClientDO clientDO);

    /**
     * 更新OAuth2 访问令牌
     *
     * @param updateReqVO 更新信息
     */
    void updateOAuth2AccessToken(@Valid OAuth2AccessTokenSaveReqVO updateReqVO);

    /**
     * 删除OAuth2 访问令牌
     *
     * @param tokenId 编号
     */
    void deleteOAuth2AccessToken(Long tokenId);

    /**
     * 获得OAuth2 访问令牌
     *
     * @param tokenId 编号
     * @return OAuth2 访问令牌
     */
    OAuth2AccessTokenDO getOAuth2AccessToken(Long tokenId);

    /**
     * 获得OAuth2 访问令牌分页
     *
     * @param pageReqVO 分页查询
     * @return OAuth2 访问令牌分页
     */
    PageResult<OAuth2AccessTokenDO> getOAuth2AccessTokenPage(OAuth2AccessTokenPageReqVO pageReqVO);
    /**
     * 校验访问令牌
     *
     * @param accessToken 访问令牌
     * @return 访问令牌的信息
     */
    OAuth2AccessTokenDO checkAccessToken(String accessToken);
    /**
     * 获得访问令牌
     *
     * 参考 DefaultTokenServices 的 getAccessToken 方法
     *
     * @param accessToken 访问令牌
     * @return 访问令牌的信息
     */
    OAuth2AccessTokenDO getAccessToken(String accessToken);
    /**
     * 移除访问令牌
     * 注意：该流程中，会移除相关的刷新令牌
     *
     * 参考 DefaultTokenServices 的 revokeToken 方法
     *
     * @param accessToken 刷新令牌
     * @return 访问令牌的信息
     */
    OAuth2AccessTokenDO removeAccessToken(String accessToken);
}